from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse
from django.utils import timezone
from django.utils.html import strip_tags
import markdown


# Create your models here.
class Category(models.Model):

    '''文章分类'''

    def __str__(self):
        return self.name

    class Meta:
        verbose_name='分类'
        verbose_name_plural = verbose_name

    #分类名称
    name = models.CharField(max_length=100)



class Tag(models.Model):
    '''文章标签'''

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = '标签'
        verbose_name_plural = verbose_name

    #标签名称
    name = models.CharField(max_length=100)


class Post(models.Model):
    '''文章内容'''

    def __str__(self):
        return self.title

    def save(self,*args,**kwargs):
        self.modified_time = timezone.now()

        # 首先实例化一个 Markdown 类，用于渲染 body 的文本。
        # 由于摘要并不需要生成文章目录，所以去掉了目录拓展。
        md = markdown.Markdown(extensions=['markdown.extensions.extra',
                                           'markdown.extensions.codehilite',
                                           ])

        # 先将 Markdown 文本渲染成 HTML 文本
        # strip_tags 去掉 HTML 文本的全部 HTML 标签
        # 从文本摘取前 54 个字符赋给 excerpt
        self.excerpt = strip_tags(md.convert(self.body))[:54]

        super().save(*args,**kwargs)

    def get_absolute_url(self):
        return reverse('blog:detail',kwargs={'pk':self.pk})


    class Meta:
        verbose_name = '文章'
        verbose_name_plural = verbose_name

    #文章标题
    title= models.CharField(verbose_name='标题',max_length=100)

    #文章正文
    body = models.TextField(verbose_name='正文')

    #文章创建时间和最后一次修改时间
    created_time = models.DateTimeField(verbose_name='创建时间',default=timezone.now)
    modified_time = models.DateTimeField(verbose_name='修改时间')

    #文章摘要,文章可以没有摘要
    #CharField默认情况下不允许为空，设置blank=True后允许空值
    excerpt = models.CharField(verbose_name='摘要',max_length=200,blank=True)

    #文章分类，分类是文章的外键，一个分类对应多篇文章
    category = models.ForeignKey(Category,verbose_name='分类',on_delete=models.CASCADE)

    #文章标签，文章与标签是多对多的关系，文章可以没有标签（blank=True）
    tags = models.ManyToManyField(Tag,verbose_name='标签',blank=True)

    # 文章作者，这里 User 是从 django.contrib.auth.models 导入的。
    # django.contrib.auth 是 django 内置的应用，专门用于处理网站用户的注册、登录等流程，User 是
    # django 为我们已经写好的用户模型。
    # 这里我们通过 ForeignKey 把文章和 User 关联了起来。
    # 因为我们规定一篇文章只能有一个作者，而一个作者可能会写多篇文章，因此这是一对多的关联关系，和
    # Category 类似。
    author = models.ForeignKey(User,verbose_name='作者',on_delete=models.CASCADE)





